空间查询

最后更新时间:2020年12月8日

空间条件查询,即通过设置空间范围条件(即点、矩形、多边形),根据选择图层、范围条件对图层要素进行查询并显示查询结果。通过结果要素可获取其空间信息与属性信息,可根据应用需求解析结果,并选择适合的方式展现。

空间查询分为单点查询、矩形查询、多边形查询,区别只在于构建查询范围对象的方法不同。在此以离线地图查询为例,展示实现方法,在线地图的查询实现与此唯一的区别即是构造查询对象使用的方法不同。

一、 单点查询 Sample详情

1

准备查询图层数据

在明确要查询的数据类型之后,就需要选择对应的、适合的FeatureQuery的构造函数,从而针对需要准备图层数据。在此以离线数据为例,直接指定某一图层为查询目标图层,在实际应用中可以通过当前加载的地图获取其图层信息,以列表方式让用户交互选择某个图层进行查询。

        MapLayer mapLayer = null;
        VectorLayer vectorLayer = null;

        //获取地图对象
        map = mapView.getMap();
        //获取查询图层对象(指定区图层)
        for (int i = 0; i < map.getLayerCount(); i++) {
            mapLayer = map.getLayer(i);
            if (mapLayer.getName().equals("水域")) {
                //获取矢量图层
                vectorLayer = (VectorLayer) mapLayer;
            }
        }

2

构造查询范围对象

构造或获取一个坐标点,作为空间范围,构造查询范围对象。

          //单点范围
          private Dot queryBound = null;

          //坐标点,可利用GraphicPoint将其绘制,便于用户查看位置
          Dot dot = new Dot(12730000,3560000);
          //几何图形的几何信息
          GraphicPoint point = new GraphicPoint(dot, 15);
          queryBound = dot;
          //设置绘制图形的样式
          point.setColor(Color.BLUE);
          mapView.getGraphicsOverlay().addGraphic(point);

          //查询范围对象(Web墨卡托)
          if (queryBound == null) {
              queryBound = new Dot(12730000, 3560000);
          }

3

创建查询对象并设置参数

根据图层数据构造查询条件对象(QueryDef),然后设置其他参数。

            //通过矢量图层创建查询对象
            FeatureQuery featureQuery = new FeatureQuery(vectorLayer);
            //设置查询条件
            QueryDef queryDef = new QueryDef();//创建查询条件对象
            //setNear(com.zondy.mapgis.geometry.Dot dot, double dx, double dy)设置点查询条件.未实现
            //queryDef.setNear(queryBound,x,y);
            queryDef.setPagination(0, 10000);  //设置分页查询
            queryDef.setWithSpatial(true); //是否设置缓存空间图形记录
            queryDef.setSubFields("*");//属性相关选项设置,设置查询结果字段集 字段名支持以空格或者'\t'隔开,如a, b , c
            featureQuery.setQueryDef(queryDef);//设置查询条件对象

            //进行要素查询
            FeaturePagedResult result = featureQuery.query();

说明:(1)建议每页结果数目设置为较小数目,这样能分解查询任务,提高效率。(2)只有空间查询才需要设置空间过滤条件,通过SpaQueryMode设置。

4

查询

执行查询操作,并获取查询结果。

        //进行要素查询
        FeaturePagedResult result = featureQuery.query();
        //获取查询结果(第一页)
        featureList = result.getPage(1);
        //自定义方法:高亮显示要素图形
        hightLightFeature(featureList);
        //进行要素查询
        FeaturePagedResult result = featureQuery.query();
        //遍历获取查询结果(可能会有多页)
        for (int i=1;i<=result.getPageCount();i++){
            List<Feature> featureList = new ArrayList<Feature>();//要素集合
            featureList = result.getPage(i);  //获取页码对应的结果,从1开始计数
            //自定义方法:高亮显示要素图形
            hightLightFeature(featureList);
        }

5

结果展示

解析查询返回的结果要素,通过标注、列表等显示展示到界面中。

    //自定义方法,绘制查询到的要素图形
    private void hightLightFeature(List featureList) {
        mapView = (MapView) findViewById(R.id.rectquery_mapview);
        //遍历每一页的要素
        for (int i = 0; i < featureList.size(); i++) {
            //获取要素对象Feature
            Feature feature = featureList.get(i);
            // 获取要素对应的图形
            List graphics = feature.toGraphics(true);
            // 高亮显示查询的结果
            mapView.getGraphicsOverlay().addGraphics(graphics);
            //额外操作:根据需要执行
            //获取要素的属性:键值对的形式
            // java.util.Map<String, String> attributes = feature.getAttributes();
            //获取要素的几何对象:可判断要素几何对象类型,进而得到相关信息:长度、面积等
            // Geometry geometry = feature.getGeometry();
            //获取要素的几何信息:可获取颜色、填充符号、点大小等等
            //GeomInfo geomInfo = feature.getInfo();
        }
        //刷新地图
        mapView.refresh();
    }

展示效果如下图所示:

点查询.jpg 点查询.jpg


二、 矩形查询 Sample详情

与单点查询不同的就是查询范围对象的设置,根据矩形范围来给定范围。

           //矩形范围,构造Rect对象
            private Rect queryBound = new Rect(12730000, 3550000, 12760000, 3580000);

            FeatureQuery featureQuery = new FeatureQuery(vectorLayer);
            // 设置查询条件
            QueryDef queryDef = new QueryDef();//创建查询条件对象
            queryDef.setPagination(0, 10000); //设置分页查询
            queryDef.setRect(queryBound, SpaQueryMode.ModeIntersect);//设置查询范围为矩形范围(相交)
            queryDef.setWithSpatial(true);//是否设置缓存空间图形记录
            queryDef.setSubFields("*");//属性相关选项设置,设置查询结果字段集 字段名支持以空格或者'\t'隔开,如a, b , c
            featureQuery.setQueryDef(queryDef);//设置查询条件对象
            
            //进行要素查询
            FeaturePagedResult result = featureQuery.query();

展示效果如下图所示:

矩形查询.png 矩形查询.png


三、 多边形查询 Sample详情

多边形查询则是根据给定的多个点构造查询范围,其它与单点查询相同。

            private Dot[] queryBound = null;
            //添加多边形查询范围图形
            Dot dot1 = new Dot(12725970, 3590399);
            Dot dot2 = new Dot(12720256, 3581161);
            Dot dot3 = new Dot(12722050, 3575104);
            Dot dot4 = new Dot(12736232, 3577852);
            Dot dot5 = new Dot(12736260, 3579983);
            Dot[] dots = {dot1, dot2, dot3, dot4, dot5, dot1};
            //构造多点数组:闭合圈
            queryBound = dots;

            // 设置多边形
            GeoPolygon geoPolygon = new GeoPolygon();
            Dots dots = new Dots();
            for(int i = 0; i < queryBound.length; i++)
            {
                dots.append(queryBound[i]);
            }
            //每条线的点个数列表
            IntList intList = new IntList();
            intList.append(dots.size());
            geoPolygon.setDots(dots, intList);

            //设置查询条件
            QueryDef queryDef = new QueryDef();
            queryDef.setPagination(0, 10000);//设置分页查询
            queryDef.setWithSpatial(true);//是否设置缓存空间图形记录
            queryDef.setSubFields("*");//属性相关选项设置,设置查询结果字段集 字段名支持以空格或者'\t'隔开,如a, b , c
            queryDef.setSpatial(geoPolygon, SpaQueryMode.ModeIntersect);//设置查询范围为多边形(精确相交)
            featureQuery.setQueryDef(queryDef);//设置查询条件对象
            //进行要素查询
            FeaturePagedResult result = featureQuery.query();

展示效果如下图所示:

多边形查询.png 多边形查询.png